#ifndef _WT588F_LIST_H_
#define _WT588F_LIST_H_

#include "wt588f_board.h"

#if _VOICE_PLAY_TYPE_ == _VOICE_PLAY_SPEAKER_

// 音频文件数据长度
#define AUDIO_FILE_DATA_SIZE                  (15ul)

/**
 * @brief 音频文件数据结构
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint8_t SizeOfFile;                       // 文件大小
  uint32_t TriggerTime;                     // 触发时间
  uint8_t FilePacket[AUDIO_FILE_DATA_SIZE]; // 音频文件
} AudioFileTable_t;

/**
 * @brief 表结构
 *
 */
typedef struct AudioNode
{
  AudioFileTable_t FileTable;     // 文件

  struct AudioNode *NextItem;     // 子节点
  struct AudioNode *PreviousItem; // 父节点
} *AudioListNode_t, AudioTable_t;

/**
 * @brief 创建返回链表的头节点
 *
 * @return AudioListNode_t - 节点
 */
extern AudioListNode_t AudioListCreate(void);

/**
 * @brief 双向链表销毁
 *
 * @param HeadNode - 链表头
 */
extern void AudioListDestroy(AudioListNode_t HeadNode);

/**
 * @brief 双向链表查找
 *
 * @param HeadNode         - 链表头
 * @param TriggerTime       - 触发时间
 * @return AudioListNode_t - 节点
 */
extern AudioListNode_t AudioListFind(AudioListNode_t HeadNode, uint32_t TriggerTime);

/**
 * @brief 实现节点的获取
 *
 * @param pFileTable       - 资源表
 * @return AudioListNode_t - 节点
 */
extern AudioListNode_t AudioBuyNode(AudioFileTable_t *pFileTable);

/**
 * @brief 双向链表在pos的前面进行插入
 *
 * @param Pos        - 位置
 * @param pFileTable - 资源表
 */
extern void AudioInsertionNode(AudioListNode_t Pos, AudioFileTable_t *pFileTable);

/**
 * @brief 双向链表删除pos位置的节点
 *
 * @param Pos - 位置
 */
extern void AudioListErase(AudioListNode_t Pos);

/**
 * @brief 双向链表尾插
 *
 * @param HeadNode   - 链表头
 * @param pFileTable - 资源表
 */
extern void AudioListPushBack(AudioListNode_t HeadNode, AudioFileTable_t *pFileTable);

/**
 * @brief 双向链表尾删
 *
 * @param HeadNode - 链表头
 */
extern void AudioListPopBack(AudioListNode_t HeadNode);

/**
 * @brief 双向链表头插
 *
 * @param HeadNode   - 链表头
 * @param pFileTable - 资源表
 */
extern void AudioListPushFront(AudioListNode_t HeadNode, AudioFileTable_t *pFileTable);

/**
 * @brief 双向链表头删
 *
 * @param HeadNode - 链表头
 */
extern void AudioListPopFront(AudioListNode_t HeadNode);

#endif
#endif
